package org.vse.aha.gui.nodes;

import java.awt.event.ActionEvent;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Action;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children;
import org.openide.nodes.PropertySupport;
import org.openide.nodes.Sheet;
import org.openide.util.HelpCtx;
import org.openide.util.Utilities;
import org.openide.util.lookup.AbstractLookup;
import org.openide.util.lookup.InstanceContent;
import org.openide.windows.WindowManager;
import org.vse.aha.common.quotes.Quote;

/**
 * Uzel reprezentující jeden výrok.
 *
 * @author Martin Vondráček
 */
public class QuoteNode extends AbstractNode {

  private Quote výrok;
  private InstanceContent ic;
  public final static String AUTOR_PROPERTY = "AUTOR";
  public final static String TEXT_PROPERTY = "TEXT";

  /**
   * Veřejný konstruktor volající soukromý konstruktor.
   *
   * @param výrok výrok, který je reprezentován tímto uzlem
   */
  public QuoteNode(Quote výrok) {
    this(výrok, new InstanceContent());
  }

  /**
   * Soukromý konstruktor.
   *
   * @param výrok výrok, který je reprezentován tímto uzlem
   * @param ic obsah pro Lookup
   */
  private QuoteNode(Quote výrok, InstanceContent ic) {
    super(Children.LEAF, new AbstractLookup(ic));
    this.výrok = výrok;
    this.ic = ic;
    this.ic.add(výrok);    
  }

  /**
   * Vrátí text zobrazený uzlem.
   *
   * @return jméno autora
   */
  @Override
  public String getDisplayName() {
    return this.výrok.getAutor();
  }

  /**
   * Vytvoří jednoduchou akci, která se vykoná po dvojkliku na uzel.
   * Samozřejmě by bylo možné připojit již existující akci pomocí
   * cesty v layer.xml atp.
   * @return akce, která se vykoná po dvojkliku na uzel
   */
  @Override
  public Action getPreferredAction() {
    return new AbstractAction() {

      @Override
      public void actionPerformed(ActionEvent e) {
        WindowManager.getDefault().findTopComponent("DetailVyrokuTopComponent").open();
      }
    };
  }

  /**
   * Přiřadí do akcí uzlu akce pro danou cestu z anotací či posléze souboru
   * layer.xml.
   * @param context
   * @return pole akcí nabízených v kontextovém menu uzlu
   */
  @Override
  public Action[] getActions(boolean context) {
    List<Action> docActions = (List<Action>) Utilities.actionsForPath("Actions/VNode");
    return docActions.toArray(
            new Action[docActions.size()]);
  }  

  /**
   * Původní metoda z průběhu příkladu: Vrátí text zobrazený uzlem.
   *
   * @return autora a 20 znaků výroku
   */
  /*
   * @Override public String getDisplayName() { return this.výrok.getAutor() +
   * ": " + this.výrok.getTextVýroku().substring(0, 20) + "...";
  }
   */
  /**
   * Metoda je jednou zavolána, aby vytvořila Sheet s objekty Properties
   *
   * @return Sheet s Properties pro tento uzel
   */
  @Override
  protected Sheet createSheet() {

    Sheet sheet = Sheet.createDefault();
    Sheet.Set set = Sheet.createPropertiesSet();

    // Read-only properties
    Property<String> autorProperty =
            new PropertySupport.ReadOnly<String>(AUTOR_PROPERTY, String.class, "Autor", "Autor výroku") {

              @Override
              public String getValue() throws IllegalAccessException, InvocationTargetException {
                return QuoteNode.this.výrok.getAutor();
              }
            };
    Property<String> textProperty =
            new PropertySupport.ReadOnly<String>(TEXT_PROPERTY, String.class, "Text", "Text výroku") {

              @Override
              public String getValue() throws IllegalAccessException, InvocationTargetException {
                return QuoteNode.this.výrok.getTextVýroku();
              }
            };
    set.put(autorProperty);
    set.put(textProperty);

    // Přidá množinu Properties do Sheet Properties
    sheet.put(set);

    return sheet;
  }
}
